// @ts-nocheck

/**
 * 重写sum方法
 * 处理小数精度问题
 */

import { isFunction, each, get, toNumberString, toNumber } from 'xe-utils'
// 外部
import { plus } from '@/utils'

function helperNumberDecimal(numStr) {
  return (numStr.split('.')[1] || '').length
}

function helperNumberAdd(addend, augend) {
  const numStr1 = toNumberString(toNumber(addend))
  const numStr2 = toNumberString(toNumber(augend))
  const decimalCount = Math.max(helperNumberDecimal(numStr1), helperNumberDecimal(numStr2))
  return plus(numStr1, numStr2, decimalCount)
}

/**
 * 求和函数，将数值相加
 *
 * @param {Array} array 数组
 * @param {Function/String} iterate 方法或属性
 * @param {Object} context 上下文
 * @return {Number}
 */
function sum(array, iterate, context?) {
  let result = 0
  each(
    array,
    iterate
      ? isFunction(iterate)
        ? function (...args) {
            result = helperNumberAdd(result, iterate.apply(context, args))
          }
        : function (val) {
            result = helperNumberAdd(result, get(val, iterate))
          }
      : function (val) {
          result = helperNumberAdd(result, val)
        }
  )
  return result
}

export { sum }
